package top.glike.ssl.auto.domain.other;

import lombok.Data;

import java.util.Date;

/**
 * packageName top.glike.model
 *
 * @author Sophia
 * @className CertInfo
 * @description TODO
 * @date 2025/10/10
 */
@Data
public class CertInfo {

    /**
     * 证书ID
     */
    private Long certId;
    /**
     * 证书订单ID
     */
    private Long orderId;

    /**
     * 证书名称
     */
    private String productName;

    /**
     * 域名
     */
    private String domain;

    /**
     * 证书状态
     */
    private String status;

    /**
     * 证书类型
     */
    private String algorithm;

    /**
     * 签发时间
     */
    private Date certStartTime;

    /**
     * 到期时间
     */
    private Date certEndTime;

    /**
     * 是否即将到期
     */
    private boolean nearExpiry;

    /**
     * 距离到期天数
     */
    private long daysToExpire;
    private String productCode;
    private String serverId;
    private String cloudProviderId;
    /**
     * 证书Pem信息
     */
    private String certificatePem;
    /**
     * 证书key信息
     */
    private String privateKey;

    /**
     * 检查证书是否即将到期
     */
    public boolean checkNearExpiry(int checkDays) {
        if (certEndTime == null) {
            return false;
        }

        long currentTime = System.currentTimeMillis();
        long expireTime = certEndTime.getTime();
        long daysDiff = (expireTime - currentTime) / (24 * 60 * 60 * 1000);

        this.daysToExpire = daysDiff;
        this.nearExpiry = daysDiff <= checkDays && daysDiff >= 0;

        return this.nearExpiry;
    }

    /**
     * 检查证书是否已过期
     */
    public boolean isExpired() {
        if (certEndTime == null) {
            return false;
        }
        boolean expired = new Date().after(certEndTime);

        // 如果已过期，重新计算过期天数（负数表示已过期多少天）
        if (expired) {
            long currentTime = System.currentTimeMillis();
            long expireTime = certEndTime.getTime();
            this.daysToExpire = (expireTime - currentTime) / (24 * 60 * 60 * 1000);
        }

        return expired;
    }

    /**
     * 获取过期状态描述
     */
    public String getExpiryStatusDescription() {
        if (certEndTime == null) {
            return "未知到期时间";
        }

        // 重新计算天数以确保准确性
        long currentTime = System.currentTimeMillis();
        long expireTime = certEndTime.getTime();
        long daysDiff = (expireTime - currentTime) / (24 * 60 * 60 * 1000);

        if (daysDiff < 0) {
            return "已过期" + Math.abs(daysDiff) + "天";
        } else {
            return "还剩" + daysDiff + "天";
        }
    }

    @Override
    public String toString() {
        return String.format("SSL证书[ID=%d, 域名=%s, 状态=%s, 到期时间=%s, %s]",
                orderId, domain, status, certEndTime, getExpiryStatusDescription());
    }

    public void setStatusByCloud(Boolean expired) {

        /**
         * PAYED：待申请。
         * CHECKING：审核中。
         * CHECKED_FAIL：审核失败。
         * ISSUED：已签发。
         * WILLEXPIRED：即将过期。
         * EXPIRED：已过期。
         * NOTACTIVATED：未激活。
         * REVOKED：吊销完成。
         */
        if (this.nearExpiry) {
            this.status = "WILLEXPIRED";
        }
        if (expired) {
            this.status = "EXPIRED";
        }
    }
}
